package com.halfsword.creativecraft.utils;

import net.minecraft.world.inventory.ContainerData;

import java.util.List;
import java.util.function.IntSupplier;

/**
 * 模块化的ContainerData实现
 * 支持动态添加数据字段和变化监听器
 */
public class ModularContainerData implements ContainerData {
    private final List<IntSupplier> suppliers;
    private final List<ContainerDataBuilder.IntConsumer> consumers;
    private final List<Runnable> changeListeners;

    /**
     * 构造函数
     * @param suppliers 数据提供者列表
     * @param consumers 数据消费者列表
     * @param changeListeners 数据变化监听器列表
     */
    public ModularContainerData(
            List<IntSupplier> suppliers,
            List<ContainerDataBuilder.IntConsumer> consumers,
            List<Runnable> changeListeners) {
        this.suppliers = suppliers;
        this.consumers = consumers;
        this.changeListeners = changeListeners;
    }

    @Override
    public int get(int index) {
        if (index < 0 || index >= suppliers.size()) {
            return 0;
        }
        return suppliers.get(index).getAsInt();
    }

    @Override
    public void set(int index, int value) {
        if (index < 0 || index >= consumers.size()) {
            return;
        }
        consumers.get(index).accept(value);

        // 通知所有变化监听器
        for (Runnable listener : changeListeners) {
            listener.run();
        }
    }

    @Override
    public int getCount() {
        return suppliers.size();
    }

    /**
     * 设置指定索引的数据消费者
     * @param index 索引
     * @param consumer 数据消费者
     */
    public void setConsumer(int index, ContainerDataBuilder.IntConsumer consumer) {
        if (index >= 0 && index < consumers.size()) {
            consumers.set(index, consumer);
        }
    }

    /**
     * 添加一个数据字段
     * @param supplier 数据提供者
     * @param consumer 数据消费者
     */
    public void addField(IntSupplier supplier, ContainerDataBuilder.IntConsumer consumer) {
        suppliers.add(supplier);
        consumers.add(consumer);
    }

    /**
     * 添加一个只读数据字段
     * @param supplier 数据提供者
     */
    public void addReadOnlyField(IntSupplier supplier) {
        suppliers.add(supplier);
        consumers.add(value -> {
            // 只读字段，忽略设置操作
        });
    }

    /**
     * 添加数据变化监听器
     * @param listener 监听器
     */
    public void addChangeListener(Runnable listener) {
        changeListeners.add(listener);
    }

    /**
     * 移除数据变化监听器
     * @param listener 监听器
     */
    public void removeChangeListener(Runnable listener) {
        changeListeners.remove(listener);
    }

    /**
     * 清空所有数据字段
     */
    public void clear() {
        suppliers.clear();
        consumers.clear();
        changeListeners.clear();
    }

    /**
     * 获取数据字段数量
     * @return 数据字段数量
     */
    public int getFieldCount() {
        return suppliers.size();
    }

    /**
     * 检查是否包含数据字段
     * @return 是否包含数据字段
     */
    public boolean isEmpty() {
        return suppliers.isEmpty();
    }

    /**
     * 检查指定索引是否有有效的消费者
     * @param index 索引
     * @return 是否有有效的消费者
     */
    public boolean hasConsumer(int index) {
        return index >= 0 && index < consumers.size() && consumers.get(index) != null;
    }

    /**
     * 通知所有变化监听器
     */
    public void notifyListeners() {
        for (Runnable listener : changeListeners) {
            listener.run();
        }
    }
}